Page({
  /**
   * 页面的初始数据
   */
  data: {
    name: "",
    phone: "",
    provinceName: "",
    cityName: "",
    districtName: "",
    detailAddress: "",
    isDefault: false,
    // 布尔值：false否 true是
    editId: null,
    addressPage: null,
  },

  /**
   * 生命周期函数--监听页面加载
   */
  // 页面第一次加载时触发 仅执行一次
  onLoad(options) {
    // options 接收收货地址传递的参数对象
    const pages = getCurrentPages();
    // getCurrentPages 获取当前收货地址的页面数组
    // 数组中第一个元素为收货地址页面，最后一个元素为当前页面
    this.setData({
      addressPage: pages.find((page) => page.route === "pages/address/address"),
      // 从页面栈找到收货地址页面
      editId: options.id || null,
      // 解释从收货地址传递的id，有id是编辑页面，无新增页面
    });
    // 当收货地址路径和编辑id同时为真，开启编辑模式
    if (this.data.addressPage && this.data.editId) {
      this.loadEditData();
      // loadEditData 加载编辑数据
    }
  },
  loadEditData() {
    const { addressPage, editId } = this.data;
    // 获取收货地址页面路径，编辑id
    const targetAddr = addressPage.data.addressList.find(
      (item) => item.id == editId
      // 收货地址里每个项的id 等于编辑id
    );
    // targetAddr目标地址
    if (!targetAddr) return;
    // 没有找到目标地址，直接终止函数，return没有返回值
    const { address: name, phone, fullAddress, isDefault } = targetAddr;
    const { province, city, district, detail } = this.splitFullAddress(
      fullAddress
    );
    // 收货地址页面的完整地址进行拆分
    // splitFullAddress拆分完整地址函数
    this.setData({
      name,
      phone,
      provinceName: province,
      cityName: city,
      districtName: district,
      detailAddress: detail,
      isDefault: isDefault === 1,
    });
    // 获取到内容更新到当前data
    wx.setNavigationBarTitle({
      // 修改页面标题
      title: "编辑收获地址",
    });
  },
  // 拆分函数
  splitFullAddress(fullAddress) {
    //  fullAddress参数
    let province = "",
      city = "",
      district = "",
      detail = "";
    // 初始化地址
    const addArr = fullAddress.split("市");
    // 情况1，地址为直辖市
    // addArr 地址数组
    // 按照市进行分割完整地址
    if (addArr.length >= 2) {
      province = addArr[0] + "市";
      // 省份=第一个数组 市分割后左侧的内容：北京
      const rest = addArr[1];
      // 剩余部分：第二个数组 市右侧所有内容 东城区....
      const districtMatch = rest.match(/^([^路巷街号]+[区县])/);
      // 正则表达式 ‘/内容/’标记正则开始和结束
      // ^ 表示匹配输入字符串的开始位置
      // $ 表示匹配输入字符串的结束位置
      //  ()需要提取内容：区/县  []字符串
      // [^路街巷号] 非（不匹配）+量词 [^路巷街号]出现一次或多次
      if (districtMatch) {
        // 如果成功提取区/县
        district = districtMatch[1];
        // districtMatch[0] 是整个匹配结果（完整字符串）
        // districtMatch[1] 提取的区县名称
        detail = rest.replace(district, "");
        city = province;
      } else {
        // 没有区
        city = province;
        detail = rest;
      }
    } else {
      // 情况2，正常省市区
      province = fullAddress.slice(0, 2) + "省";
      // slice字符串截取 提取完整地址前两个字
      // 字符串.slice(开始位置, 结束位置)
      city = fullAddress.slice(2, 4) + "市";
      detail = fullAddress.slice(4);
      // 截取到 endIndex - 1为止
      // 如果省略 endIndex，则默认截取到字符串的末尾
    }
    // 返回拆分后的地址
    return { province, city, district, detail };
  },
  onAddressChange(e) {
    // 地址变化后的自定义函数
    // event 事件
    const [province, city, district] = e.detail.value;
    // 从事件详情获取省市区
    this.setData({
      // 地址改变后，更新当前的data数据
      provinceName: province,
      cityName: city,
      districtName: district,
    });
  },
  // 定位函数
  onLocation() {
    this.setData({
      provinceName: "北京市",
      cityName: "北京市",
      districtName: "东城区",
      detailAddress: "世纪大道花木街道",
    });
    wx.showToast({
      // 显示定位成功的弹窗
      title: "定位成功",
    });
  },
  // 检查表单验证
  checkForm() {
    const { name, phone, provinceName, detailAddress } = this.data;
    // 在当前data数据里获取需要检查的值
    // 验证1，收货人姓名是否为空
    if (!name.trim()) return "请输入收货人姓名";
    // trim()空格处理 去除字符串开头和结尾的空白字符
    // 验证2，收货人手机号是否合法
    if (!/^1\d{10}$/.test(phone.trim())) return "请输入正确的手机号";
    // ‘/内容/’ 正则表达式内容
    //^ 表示匹配输入字符串的开始位置
    //$ 表示匹配输入字符串的结束位置
    // \d匹配数字 {10}字符串位数
    // ^1手机号必须以1开头，\d{10}后续匹配10位数，手机号为11位数
    // test(phone.trim()) 正则表达式清除去除字符串开头和结尾的空白字符
    // 验证3，所在地区是否为空
    if (!provinceName) return "请选择所在地区";
    // 验证4，详细地址是否为空
    if (!detailAddress.trim()) return "请输入详细地址";
    // 验证成功后的返回值
    return "";
    // 空字符代表没有错误弹窗，所有验证通过
  },
  // 保存按钮
  saveAddress() {
    const { addressPage, editId } = this.data;
    // data里获取收货地址列表以及编辑id
    // editId有值：编辑模式 editId为空：新增模式
    const errMsg = this.checkForm();
    // 获取错误信息
    if (errMsg)
      return wx.showToast({
        // 显示弹窗
        title: errMsg,
        icon: "none",
      });
    // 当验证成功后，保存地址
    const {
      name,
      phone,
      provinceName,
      cityName,
      districtName,
      detailAddress,
      isDefault,
    } = this.data;
    // 在当前data里获取需要保存的数据
    // 拼接完整地址
    const fullAddress = `${provinceName}${cityName}${districtName}${detailAddress}`;
    // 拼接所在地区（省市区）和详细地址为完整的收货地址
    // 在当前页面保存完整地址到收货地址列表
    const newAddr = {
      // 获取新地址列表
      name: name.trim(),
      phone: phone.trim(),
      isDefault: isDefault ? 1 : 0,
      // 三元运算符 isDefault 判断条件
      // 当判断条件为真：1，当判断条件为假：0
      address: fullAddress,
      id: editId || Date.now(),
      // 当编辑状态时，id=editId
      // Date.now()时间戳
      //  用时间戳当地址id,新增状态时，返回唯一的id
    };
    if (!addressPage) return;
    // 当没有找到地址列表页，终止函数，直接退出
    const newAddressList = editId
      ? this.updateEditAddr(addressPage.data.addressList, newAddr)
      : [...addressPage.data.addressList, newAddr];
    // 条件表达式 ? 条件成立时的返回值 : 条件不成立时的返回值
    // editId判断条件 真 是编辑状态时：更新原列表的数据
    // 假 新增状态时：... 扩展运算符 新增一条收货地址列表在收货地址页面末尾
    addressPage.setData({
      // 保存成功后，刷新收货地址列表
      addressList: newAddressList,
    });
    // 保存成功后弹窗
    wx.showToast({
      title: editId ? '编辑地址成功' : '新增地址成功',
      // 三元运算符
      icon:'none'
    });
    setTimeout(()=> wx.navigateBack(),800);
    // 延迟函数，预留一定时间查看成功提示
    // wx.navigateBack()返回上一页，返回收货地址
    // 800时间 单位毫秒，0.8秒
  },
  updateEditAddr(list, newAddr) {
    // list收货地址列表
    // newAddr 更新后的列表
    return list.map((item) => (item.id == newAddr.id ? newAddr : item));
    // 更新收获地址页面的编辑地址
    // 数组项id 等于 编辑地址id 返回新地址；否则返回原item,收货地址列表保持不变

    // map是数组的遍历方法，会遍历原数组（list）的每一个元素
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {},

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {},

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {},

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {},

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {},

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {},

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {},
});
